package fr.miage.course7.app.view;

import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.TreeSet;

import javax.imageio.ImageIO;
import javax.swing.JLabel;
import javax.swing.JPanel;

import fr.miage.course7.app.model.Participant;
import fr.miage.course7.app.model.Transmission;

/**
 * Classe permettant de rafraichir le parcours des bateaux.
 * @author Jean-Yannick TILIN
 * @author Alexandre JAHAN
 *
 */
public class RafraichirItemListener implements ItemListener {

    /**
     * Fenetre principale.
     */
    private Fenetre mainFrame;

    /**
     * Panel d'information.
     */
    private JPanel panInfo;

    /**
     * Label d'information.
     */
    private JLabel labInfo;

    /**
     * Liste de panels liés aux bateaux.
     */
    private ArrayList<JPanel> lesPanelInvisibles;

    /**
     * Constructeur de la classe.
     * @param frame fenètre principale
     */
    public RafraichirItemListener(final Fenetre frame) {
        mainFrame = frame;
        lesPanelInvisibles = new ArrayList<JPanel>();
    }

    /**
     * Méthode qui reçoit l'evenement clic sur un élément de la liste des dates.
     * @param event evenement
     */
    public final void itemStateChanged(final ItemEvent event) {
        mainFrame.getPan().clear();
        for (JPanel pan : lesPanelInvisibles) {
            mainFrame.remove(pan);
        }

        int x, y;
        for (Iterator<Participant> iter = mainFrame.getControl()
                                                   .getCourse()
                                                   .getParticipants()
                                                   .values()
                                                   .iterator();
             iter.hasNext();) {

            Participant part = iter.next();
            TreeSet<Transmission> listeCoord = part.getTransmissions();
            Iterator<Transmission> iterTransmission = listeCoord.iterator();

            Transmission iterBack = iterTransmission.next();
            Transmission iterCourant = iterBack;

            int cpt = 0;

            while (iterTransmission.hasNext()
                   && cpt < Integer.parseInt(event.getItem().toString())) {

                iterCourant = iterTransmission.next();

                // Traitement particulier
                if (Math.abs(iterBack.getPosition().getLon()
                            - iterCourant.getPosition().getLon()
                            ) > 120) {

                    int diff = 0;
                    if(iterCourant.getPosition().getLon() > 0) {
                        diff = - 360 + iterCourant.getPosition().getLon();
                        float coeffDirect = -(float)(iterCourant.getPosition().getLat()-iterBack.getPosition().getLat())/(float)(diff-iterBack.getPosition().getLon());
                        int nouvLat = (int)(iterBack.getPosition().getLat()+(-180-diff)*coeffDirect);
                        mainFrame.getPan().addDrawable(new LineDrawable(mainFrame.getLesCouleurs().get(Integer.parseInt( part.getIdentifiant() + "" )), 
                                                                        mainFrame.ajusteLong(iterBack.getPosition().getLon()),
                                                                        mainFrame.ajusteLat(iterBack.getPosition().getLat()), 
                                                                        mainFrame.ajusteLong(-180), 
                                                                        mainFrame.ajusteLat(nouvLat)
                                                                        )
                                                        );
                        mainFrame.getPan().addDrawable(new LineDrawable(mainFrame.getLesCouleurs().get(Integer.parseInt( part.getIdentifiant() + "" )), 
                                                                        mainFrame.ajusteLong(180),
                                                                        mainFrame.ajusteLat(nouvLat), 
                                                                        mainFrame.ajusteLong(iterCourant.getPosition().getLon()), 
                                                                        mainFrame.ajusteLat(iterCourant.getPosition().getLat())
                                                                        )
                                                        );
                    } else {
                        diff = 360+iterCourant.getPosition().getLon();
                        float coeffDirect = -(float)(iterCourant.getPosition().getLat()-iterBack.getPosition().getLat())/(float)(diff-iterBack.getPosition().getLon());
                        int nouvLat = (int)(iterBack.getPosition().getLat()+(180-diff)*coeffDirect);
                        mainFrame.getPan().addDrawable(new LineDrawable(mainFrame.getLesCouleurs().get(Integer.parseInt( part.getIdentifiant() + "" )), 
                                                                        mainFrame.ajusteLong(iterBack.getPosition().getLon()),
                                                                        mainFrame.ajusteLat(iterBack.getPosition().getLat()), 
                                                                        mainFrame.ajusteLong(180), 
                                                                        mainFrame.ajusteLat(nouvLat)
                                                                        )
                                                        );
                        mainFrame.getPan().addDrawable(new LineDrawable(mainFrame.getLesCouleurs().get(Integer.parseInt( part.getIdentifiant() + "" )), 
                                                                        mainFrame.ajusteLong(-180),
                                                                        mainFrame.ajusteLat(nouvLat), 
                                                                        mainFrame.ajusteLong(iterCourant.getPosition().getLon()), 
                                                                        mainFrame.ajusteLat(iterCourant.getPosition().getLat())
                                                                        )
                                                        );
                    }
                    iterBack = iterCourant;
                    cpt++;
                } else {
                    mainFrame.getPan().addDrawable(new LineDrawable(mainFrame.getLesCouleurs().get(Integer.parseInt( part.getIdentifiant() + "" )), mainFrame.ajusteLong(iterBack.getPosition().getLon()), mainFrame.ajusteLat(iterBack.getPosition().getLat()), mainFrame.ajusteLong(iterCourant.getPosition().getLon()), mainFrame.ajusteLat(iterCourant.getPosition().getLat())));
                    iterBack = iterCourant;
                    cpt++;
                }

            }


            if (Integer.parseInt(event.getItem().toString()) != 0) {
                x = mainFrame.ajusteLong(iterCourant.getPosition().getLon());
                y = mainFrame.ajusteLat(iterCourant.getPosition().getLat());
            } else {
                x = mainFrame.ajusteLong(iterBack.getPosition().getLon());
                y = mainFrame.ajusteLat(iterBack.getPosition().getLat());
            }
            JPanel panInvisible = new JPanel();
            lesPanelInvisibles.add(panInvisible);
            mainFrame.add(panInvisible);
            panInvisible.setSize(25, 25);
            panInvisible.setOpaque(false);
            panInvisible.setLocation(x, y);
            panInvisible.setVisible(true);
            panInvisible.addMouseListener(new RafraichirItemMouseListener(this, panInvisible, part, iterCourant.getPosition()));
            try {
                BufferedImage img = ImageIO.read(new File("./src/main/resources/bateau" + part.getIdentifiant() + ".png"));
                mainFrame.getPan().addDrawable(new ImageDrawable(img, x, y, 25, 25));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * Méthode qui renvoie la fenetre principale.
     * @return fenetre principale
     */
    public final Fenetre getMainFrame() {
        return mainFrame;
    }
    
    public ArrayList<JPanel> getPanInvisible() {
    	return lesPanelInvisibles;
    }

}
